#ifndef LeerEscribirSector
#define LeerEscribirSector

#include "Estructuras.h"
#include <sys/mman.h>
#include <unistd.h>

#define CANTIDADCENTROS 1
#define SECTOR_INVALIDO_LECTURA ((void *) -1)
#define FALLO_MALLOC ((void *) -2)
#define SECTOR_INVALIDO_ESCRITURA -1
#define FALLO_MSYNC -2


t_chs convierteSectorAChs(long);
void * leerSector(long);
int escribirSector (long, void *);

t_chs convierteSectorAChs(long sector) {
        t_chs chs;

        chs.cabezal = cantidadCabezales;
        chs.pista = (int) (sector / cantSecPorPista);
        chs.sector = (int) (sector % cantSecPorPista);
        return chs;
}


void * leerSector(long sector) {

    if(sector >cantSecPorPista * cantidadPistas) return SECTOR_INVALIDO_LECTURA;

    t_chs chs;
    void * sectorADevolver;
    unsigned long direccion;

    sectorADevolver = malloc(512);
    if (sectorADevolver == NULL) return FALLO_MALLOC;
    chs = convierteSectorAChs(sector);
    CHS.pista = chs.pista;
    CHS.sector = chs.sector;

    direccion = sector * 512;
    memcpy(sectorADevolver, (Disco + direccion), 512);
    return sectorADevolver;

}

int escribirSector (long sector, void * nuevosDatos){

    if(sector >cantSecPorPista * cantidadPistas) return SECTOR_INVALIDO_ESCRITURA;

    t_chs chs;
    unsigned long direccion;
    int ret;
    direccion = sector * 512;

    chs = convierteSectorAChs(sector);
    CHS.pista = chs.pista;
    CHS.sector = chs.sector;

    unsigned int posicion;
    for (posicion = 0; posicion < 512; posicion ++)
          *(Disco + (direccion + posicion)) = *(((char *) nuevosDatos) + posicion);

    ret = msync(Disco, tamanoDisco, MS_SYNC);
    if(ret == -1) return FALLO_MSYNC;
    return 1;
}

#endif

